#include "util.hpp"
#include "config.hpp"
#include "data.hpp"
#include "hot.hpp"
#include "service.hpp"

void FileUtilTest(const std::string &filename) // 通过测试！
{

    // == == == == 测试file文件格式========通过测试！
    // cloud::FileUtil fu(filename);
    // std::cout << fu.FileSize() << std::endl;
    // std::cout << fu.LastMTime() << std::endl;
    // std::cout << fu.LastATime() << std::endl;
    // std::cout << fu.FileName() << std::endl;

    // ========测试文件输入输出========通过测试！
    // cloud::FileUtil fu(filename);
    // std::string body;
    // fu.GetContent(&body);
    // cloud::FileUtil nfu("./hello.txt");
    // nfu.SetContent(body);

    // ========压缩 解压========通过测试！
    // std::string packname = filename + ".lz";

    // cloud::FileUtil fu(filename);
    // fu.Compress(filename + ".lz");

    // cloud::FileUtil pfu(packname);
    // pfu.UnCompress("./hello.txt");

    //=======创建目录===========通过测试！
    // cloud::FileUtil fu(filename);
    // fu.CreateDirectory();
    // std::vector<std::string> array;
    // fu.ScanDirectory(&array);
    // for (auto &a : array)
    // {
    //     std::cout << a << std::endl;
    // }
    // cloud::FileUtil fu(filename);
    // fu.CreateDirectory();
    // std::vector<std::string> array;
    // fu.ScanDirectory(&arra y);
    // for (auto &a : array)
    // {
    //     std::cout << a << std::endl;
    // }
}

void JsonUtilTest() // 通过测试！
{
    const char *name = "kenziiii"; 
    
    int age = 1111;
    float score[] = {99.6, 64.8, 85.6};
    // 将其放到Json::Value中
    Json::Value root;
    root["name"] = name;
    root["age"] = age;
    for (int i = 0; i < 3; i++)
    {
        root["score"].append(score[i]);
    }
    std::string json_str;
    cloud::JsonUtil::Serialize(root, &json_str);
    std::cout << json_str << std::endl;

    Json::Value val;
    cloud::JsonUtil::UnSerialize(json_str, &val);
    std::cout << val["name"].asString() << std::endl;
    std::cout << val["age"].asInt() << std::endl;
    for (int i = 0; i < val["score"].size(); i++)
    {
        std::cout << val["score"][i].asFloat() << std::endl;
    }
}

void ConfigTest() // 通过测试！
{
    cloud::Config *config = cloud::Config::GetInstance();
    std::cout << config->GetHotTime() << std::endl;
    std::cout << config->GetServerPort() << std::endl;
    std::cout << config->GetServerIp() << std::endl;

    std::cout << config->GetDownloadPrefix() << std::endl;
    std::cout << config->GetPackfileSuffix() << std::endl;
    std::cout << config->GetPackDir() << std::endl;

    std::cout << config->GetBackDir() << std::endl;
    std::cout << config->GetBackUpFile() << std::endl;
}

void DataTest(const std::string &filename) // 通过测试！
{
    cloud::BackupInfo info;
    info.NewBackupInfo(filename);
    std::cout << info.pack_flag << std::endl;
    std::cout << info.fsize << std::endl;
    std::cout << info.mtime << std::endl;
    std::cout << info.atime << std::endl;
    std::cout << info.real_path << std::endl;
    std::cout << info.pack_path << std::endl;
    std::cout << info.url << std::endl;
}

void DataManagerTest1(const std::string &filename) // 通过测试！
{
    cloud::BackupInfo info;
    info.NewBackupInfo(filename);
    cloud::DataManager data;
    data.Insert(info);
    // 测试获取单个信息
    cloud::BackupInfo tmp;
    data.GetOneByUrl("/download/bundle.h", &tmp);
    std::cout << "-------------insert and getonebyurl -------------\n";
    // 调用这个函数之后就会把所有的信息赋值，我们输出一遍进行查看
    std::cout << tmp.pack_flag << std::endl;
    std::cout << tmp.fsize << std::endl;
    std::cout << tmp.mtime << std::endl;
    std::cout << tmp.atime << std::endl;
    std::cout << tmp.real_path << std::endl;
    std::cout << tmp.pack_path << std::endl;
    std::cout << tmp.url << std::endl;

    // 更改压缩标志位
    std::cout << "---------------update and getall --------------\n";
    info.pack_flag = true;
    data.Update(info);
    std::vector<cloud::BackupInfo> array;
    data.GetAll(&array);
    for (auto &a : array)
    {
        std::cout << a.pack_flag << std::endl;
        std::cout << a.fsize << std::endl;
        std::cout << a.mtime << std::endl;
        std::cout << a.atime << std::endl;
        std::cout << a.real_path << std::endl;
        std::cout << a.pack_path << std::endl;
        std::cout << a.url << std::endl;
    }
    // 根据实际路径来查
    std::cout << "---------------------getonebyrealpath--------------\n";
    data.GetOneByRealPath(filename, &tmp);
    std::cout << tmp.pack_flag << std::endl;
    std::cout << tmp.fsize << std::endl;
    std::cout << tmp.mtime << std::endl;
    std::cout << tmp.atime << std::endl;
    std::cout << tmp.real_path << std::endl;
    std::cout << tmp.pack_path << std::endl;
    std::cout << tmp.url << std::endl;
}

void DataManager1(const std::string &filename) // 通过测试！
{
    cloud::DataManager data;
    std::vector<cloud::BackupInfo> array;
    data.GetAll(&array);

    for (auto &a : array)
    {
        std::cout << a.pack_flag << std::endl;
        std::cout << a.fsize << std::endl;
        std::cout << a.mtime << std::endl;
        std::cout << a.atime << std::endl;
        std::cout << a.real_path << std::endl;
        std::cout << a.pack_path << std::endl;
        std::cout << a.url << std::endl;
    }
}

cloud::DataManager *_data;

// 同时要将配置文件中的ip地址改为0.0.0.0否则无法监听!!!!!!!
void ServiceTest() // 通过测试！
{
    cloud::Service srv;
    srv.RunModule();
}

// void HotTest() // 通过测试！
// {
//     cloud::HotManager hot;
//     hot.RunModule();
// }

// // 测试服务端业务处理-业务上传请求
// // 定义一个全局变量
// cloud::DataManager *_data;
// void ServiceTest()
// {
//     cloud::Service server;
//     server.RunModule();
// }
// int main(int argc, char *argv[])
// {
//     _data = new cloud::DataManager;
//     // 创建多线程
//     // 运行的时是HotManagerTest这个函数，参数是线程入口函数，还可以传递参数，可以传递多个参数
//     std::thread thread_hot_manager(HotTest);
//     std::thread thread_service(ServiceTest);
//     // 两个线程创建完毕各自运行一个模块的功能
//     // 等待线程退出
//     thread_hot_manager.join();
//     thread_service.join();

//     return 0;
// }

int main(int argc, char *argv[])
{
    _data = new cloud::DataManager();
    ServiceTest();
    // FileUtilTest(argv[1]);
    // DataManager1(argv[1]);
    // JsonUtilTest();
    // ConfigTest();
    // DataTest(argv[1]);
    // HotTest();
    // ServiceTest();

    return 0;
}
